package com.hjh.netty.elect.demo1.common;

import com.alibaba.fastjson.JSONObject;
import io.netty.buffer.ByteBuf;
import io.netty.buffer.Unpooled;
import io.netty.channel.ChannelHandler.Sharable;
import io.netty.channel.ChannelHandlerContext;
import io.netty.channel.ChannelInboundHandlerAdapter;
import io.netty.util.CharsetUtil;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Component;

import java.io.UnsupportedEncodingException;
import java.util.HashMap;
import java.util.Map;

//物联网 开启检测端口 并写入数据库
@Slf4j
@Component
@Sharable
public class ServerHandler extends ChannelInboundHandlerAdapter {
    //此处注入数据源操作sql   执行插入设备上传的数据
//		    @Resource
//		    private Product_dataServiceImpl product_dataServiceImpl;
    //  将当前客户端连接 存入map   实现控制设备下发 参数
    public static Map<String, ChannelHandlerContext> map = new HashMap<String, ChannelHandlerContext>();

    /**
     * 获取数据
     *
     * @param ctx 上下文
     * @param msg 获取的数据
     * @throws UnsupportedEncodingException
     */
    @Override
    public void channelRead(ChannelHandlerContext ctx, Object msg) throws UnsupportedEncodingException {
        //msg为接收到的客户端传递的数据   个人这边直接传的json 数据
        ByteBuf readMessage = (ByteBuf) msg;
        //解析客户端json 数据
//        JSONObject json = JSONObject.fromObject(readMessage.toString(CharsetUtil.UTF_8));
//        JSONObject json = JSONObject.fromObject(readMessage.toString(CharsetUtil.UTF_8));

        JSONObject json =JSONObject.parseObject(readMessage.toString(CharsetUtil.UTF_8));
        System.out.println("接收到的数据" + readMessage.toString(CharsetUtil.UTF_8));

        //获取客户端的请求地址  取到的值为客户端的 ip+端口号
        String url = ctx.channel().remoteAddress().toString();//设备请求地址（个人将设备的请求地址当作 map 的key）
        //将当前的设备ip+端口存进map  当做下发设备的标识的key
        //如果已经存在就不用重复存入map
        if (map.get(url) == null) {
            log.info("channelRead|url:{}",url);
            map.put(url, ctx);
        }
        int users = 0;
        //设备请求的 服务器端的地址   用作监听设备请求的那个端口
        String servicePort = ctx.channel().localAddress().toString();
        //判断端口如果客户端请求的端口号为9011
        System.out.println("向：" + servicePort.substring(servicePort.length() - 4, servicePort.length()) + " 端口写入数据");
        if (servicePort.substring(servicePort.length() - 4, servicePort.length()).equals("9011")) {
//				        	Product_data product_data=new Product_data();
//			        		//设备请求地址  存入数据库  下方controller层 通过设备id查询此地址   取到map种存入的 ChannelHandlerContext 实现数据下发
//					        product_data.setUrl(url);
//					        product_data.setJson(readMessage.toString(CharsetUtil.UTF_8));//设备请求时原生数据
//					        product_data.setDeviceID(json.get("deviceID").toString());//设备数据1
//					        product_data.setPower1(json.get("power1").toString());//设备数据2
//					        product_data.setPower2(json.get("power2").toString());//设备数据3
//					        product_data.setPower3(json.get("power3").toString());//设备数据4
//					        product_data.setAcquisitionTime(TimeUtile.showDate());//时间 (个人整的当前时间工具类  替换成自己获取当前时间的方法即可）
//					        //执行写入操作    此处写你们要插入的表操作语句即可
//					        users = product_dataServiceImpl.add_Device_shuju(product_data);
        } else {
//		        	 		//否则取另外的值 进行写入 数据库
//		        	 		Product_data product_data=new Product_data();
//		        	 		//设备请求地址  存入数据库  下方controller层 通过设备id查询此地址   取到map种存入的 ChannelHandlerContext 实现数据下发
//					        product_data.setUrl(url);
//					        product_data.setJson(readMessage.toString(CharsetUtil.UTF_8));//设备请求时原生数据
//					        product_data.setDeviceID(json.get("deviceID").toString());//设备数据1
//					        product_data.setData1(json.get("data1").toString());//设备数据2
//					        product_data.setData2(json.get("data2").toString());//设备数据3
//					        product_data.setData3(json.get("data3").toString());//设备数据4
//					        product_data.setAcquisitionTime(TimeUtile.showDate());//时间 (个人整的当前时间工具类  替换成自己获取当前时间的方法即可）
//					        //执行写入操作    此处写你们要插入的表操作语句即可
//					        users = product_dataServiceImpl.add_Device_data(product_data);
        }
        String rmsg = "11 02 00 C4 00 16 ";//返回成功的信息
        ByteBuf message = Unpooled.copiedBuffer(rmsg.getBytes());//处理返回的信息
        //ctx.write(in2);//返回信息
        ctx.writeAndFlush(message);//返回信息
        //刷新缓存区
        ctx.flush();
    }

    @Override
    public void exceptionCaught(ChannelHandlerContext ctx, Throwable cause) throws Exception {
        cause.printStackTrace();
        ctx.close();
    }
}

